package 进阶阶段;

import java.io.*;

public class demo26IO流_序列化流 {
    public static void main(String[] args) throws Exception {
        //Java 提供了一种对象序列化的机制。用一个字节序列,可以表示一个对象，该字节序列包含该`对象的数据`、`对象的类型`和
        //`对象中存储的数据`等信息。字节序列,写出到文件之后，相当于,文件中**持久保存了一个对象的信息。

        //反之，该字节序列,还可以从文件中读取回来，重构对象，对它进行反序列化。`对象的数据`、`对象的类型`和`对象中存储的数
        //据`信息，可以重新用来在内存中创建对象

        System.out.println("--------------------------------------");
        System.out.println("序列化输出流");

        //ObjectOutputStream类,对象输出流,写对象：将Java对象写到文件,实现对象的持久存储。
            //ObjectOutputStream(OutputStream out)： 创建一个指定OutputStream的ObjectOutputStream。

        //一个对象要想序列化，必须满足两个条件:
            //1. 该类必须实现Serializable接口，Serializable是一个标记接口,读作序列化接口，不实现此接口的类,将不会使任何状态,序列化或反序列化，会抛出`NotSerializableException` 。
            //2. 该类的所有属性必须是可序列化的。如果有一个属性不需要序列化的，则该属性必须注明是瞬态的，使用`transient`关键字修饰。//

        Person person = new Person("宋祖儿" , 18 , "女");

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
        oos.writeObject(person);

        oos.close();

        System.out.println("--------------------------------------");
        System.out.println("序列化输入流，也叫反序列化");

        //ObjectInputStream反序列化流，将之前使用ObjectOutputStream序列化的原始数据,恢复为对象。
            //ObjectInputStream(InputStream in)：创建一个指定InputStream的ObjectInputStream。

            //readObject(): 读取一个对象。

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
//        ois.readObject();

        Person person1 = (Person) ois.readObject();

        System.out.println(person1.getName() + person1.getAge() + "岁" + person1.getGender());//gender被关键字transient修饰，该属性必须注明是瞬态的，不能被序列化

        ois.close();

    }
}

class Person implements Serializable {
    private String name;
    private int age;
    private transient String gender;//transient修饰不被序列化

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}
